﻿Imports FairShop.Helpers
Imports System.Drawing.Printing

Public Class AanmaakBarcodesForm

    Private _mainForm As Form
    Private _sluitNaAfdrukken As Boolean

    Public Property Barcode() As String
        Get
            Return tbBarcode.Text
        End Get
        Set(ByVal value As String)
            tbBarcode.Text = value
        End Set
    End Property

#Region "Constructor"

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sluitNaAfdrukken">Bepaalt of het formulier wordt afgesloten na het drukken op de knop "Afdrukken".
    ''' Bij het opstarten vanuit het hoofdscherm gebeurt dit niet, bij het opstarten vanuit het LeveringDetailsForm wel.
    ''' Indien False kunnen er ook meerdere verschillende barcodes na mekaar gegenereerd en afgedrukt worden.</param>
    Public Sub New(ByVal sluitNaAfdrukken As Boolean)
        Me.InitializeComponent()
        _mainForm = MainForm
        _sluitNaAfdrukken = sluitNaAfdrukken
        btnVolgende.Visible = Not _sluitNaAfdrukken ' alleen bij het afdrukken van meerdere barcodes moet deze knop beschikbaar zijn

        tbMargeBovenkant.Text = (Constants.Barcodes.BREEDTE_RAND_ETIKETTEN_IN_MM / 10.0F).ToString()

        tbBarcode.Text = BarcodeDal.GetNieuweBarcode()
        ' vorige instellingen ophalen
        UpDownAantalRijen.Value = My.Settings.aantalBarcodesVertikaal
        UpDownAantalKolommen.Value = My.Settings.aantalBarcodesHorizontaal

        ' eerste vakje al selecteren
        Me.Raster1.Selection(0, 0) = True

        RefreshPreview()
    End Sub

#End Region

#Region "Event handlers"

    Private Sub UpDownAantalKolommen_ValueChanged(ByVal sender As Object, ByVal e As EventArgs) Handles UpDownAantalKolommen.ValueChanged
        Me.Raster1.AantalKolommen = Convert.ToInt32(Me.UpDownAantalKolommen.Value)
        RefreshPreview()
    End Sub

    Private Sub UpDownAantalRijen_ValueChanged(ByVal sender As Object, ByVal e As EventArgs) Handles UpDownAantalRijen.ValueChanged
        Me.Raster1.AantalRijen = Convert.ToInt32(Me.UpDownAantalRijen.Value)
        RefreshPreview()
    End Sub

    Private Sub Raster1_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles Raster1.SelectionChanged
        ShowSelectionInfo()
        RefreshPreview()
    End Sub

    Private Sub tbMargeBovenkant_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles tbMargeBovenkant.TextChanged
        ShowSelectionInfo()
        RefreshPreview()
    End Sub

    Private Sub btnAfdrukken_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnAfdrukken.Click

        ' barcodes printen
        Dim margeBovenkantInCm As Double
        If (Not Double.TryParse(tbMargeBovenkant.Text, margeBovenkantInCm)) Then
            lblInfo.Text = "Ongeldige waarde voor marge bovenkant"
            lblInfo.BackColor = Constants.Kleuren.ONGELDIG
            Return
        End If
        Dim listOfBarcodes As List(Of String) = GetListOfBarcodes(Barcode)
        Dim printDoc As New PrintBarcodeDocument(listOfBarcodes, Raster1, margeBovenkantInCm)
        printDoc.PrinterSettings.PrinterName = Configuratie.Printer
        printDoc.Print()

        ' instellingen bewaren
        My.Settings.aantalBarcodesVertikaal = Convert.ToInt32(UpDownAantalRijen.Value)
        My.Settings.aantalBarcodesHorizontaal = Convert.ToInt32(UpDownAantalKolommen.Value)

        If (_sluitNaAfdrukken) Then
            Me.DialogResult = Windows.Forms.DialogResult.OK
            Me.Close()
        End If
    End Sub

    Private Sub btnVolgende_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnVolgende.Click
        tbBarcode.Text = BarcodeHelper.GetNextBarcode(tbBarcode.Text)
    End Sub

    Private Sub cbMaakReeks_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles cbMaakReeks.CheckedChanged
        RefreshPreview()
    End Sub

    Private Sub lbAlles_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles lbAlles.LinkClicked
        Me.Raster1.SelecteerAlles()
    End Sub

    Private Sub lbNiets_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles lbNiets.LinkClicked
        Me.Raster1.SelecteerNiets()
    End Sub

    Private Sub btnZoeken_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnZoeken.Click
        Me.Cursor = Cursors.WaitCursor
        Dim zoekterm As String = ""
        If (Utility.CheckValidZoekterm(tbBarcode.Text)) Then
            zoekterm = tbBarcode.Text
        End If
        Dim f As New ZoekArtikelForm(zoekterm, True)
        If (f.ShowDialog() = DialogResult.OK AndAlso f.Artikel IsNot Nothing) Then
            tbBarcode.Text = f.Artikel.Barcode
        End If
        Me.Cursor = Cursors.Default
    End Sub

#End Region

#Region "Private methodes"

    Private Sub ShowSelectionInfo()
        Dim aantalSelecties As Integer = 0
        For row As Integer = 0 To Me.Raster1.AantalRijen - 1
            For column As Integer = 0 To Me.Raster1.AantalKolommen - 1
                If (Me.Raster1.Selection(row, column)) Then aantalSelecties += 1
            Next
        Next
        lblInfo.Text = String.Format("{0} etiket(ten) geselecteerd", aantalSelecties)
        lblInfo.BackColor = SystemColors.Control
    End Sub

    Private Sub RefreshPreview()
        Dim margeBovenkantInCm As Double
        If (Not Double.TryParse(tbMargeBovenkant.Text, margeBovenkantInCm)) Then
            lblInfo.Text = "Ongeldige waarde voor marge bovenkant"
            lblInfo.BackColor = Constants.Kleuren.ONGELDIG
            Return
        End If
        Dim listOfBarcodes As List(Of String) = GetListOfBarcodes(Barcode)
        Dim printDoc As New PrintBarcodeDocument(listOfBarcodes, Raster1, margeBovenkantInCm)
        printDoc.PrinterSettings.PrinterName = Configuratie.Printer

        Me.PrintPreviewControl1.Document = printDoc
        Me.PrintPreviewControl1.InvalidatePreview()
        ShowSelectionInfo()
    End Sub

    Private Function GetListOfBarcodes(ByVal startBarcode As String) As List(Of String)
        Dim lijst As New List(Of String)
        Dim barcode As String = startBarcode
        For row As Integer = 0 To Raster1.AantalRijen - 1
            For column As Integer = 0 To Raster1.AantalKolommen - 1
                If (Raster1.Selection(row, column)) Then
                    lijst.Add(barcode)
                    If (cbMaakReeks.Checked) Then
                        barcode = BarcodeHelper.GetNextBarcode(barcode)
                    End If
                End If
            Next
        Next
        Return lijst
    End Function

#End Region

End Class